package com.neu.util;

import android.util.Log;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.JsonRequest;
import com.google.gson.Gson;
import com.neu.App;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

/**
 * Volley的工具类
 *
 */
public class NetUtil<T> {
    //打印log信息
    private static String TAG="TAG";
    //接口的初始地址
    public  static String BASE_URL="http://124.93.196.45:10001";
    //登录的Token
    public static String Token=null;
    //声明回调接口
    public BackJson<T> backJson;

    private Class<T> aClass;

    public NetUtil(Class<T> aClass){
        this.aClass=aClass;
    }

    /**
     * Volley访问的方法
     * @param method 访问的方法  get,post delete put
     * @param url 接口的url
     * @param param 接口的参数（json格式）
     * @param backJson 成功后，回调的接口
     */
    public  void request(int method, String url, Map<String,String> param,final BackJson<T> backJson){
        //转换参数
        final JSONObject jb=new JSONObject();
        try{
            if(param!=null){
                for(String key:param.keySet()){
                    jb.put(key,param.get(key));
                }
                Log.d(TAG, "传入的参数："+jb.toString());
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        //创建request对象
        JsonRequest jr=new JsonObjectRequest(method, BASE_URL + url, jb, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                //回调的数据
                String json=jsonObject.toString();
                Log.d(TAG, "响应的结果： "+json);
                T t=new Gson().fromJson(json,aClass);
                backJson.success(t);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                volleyError.printStackTrace();
                Toast.makeText(App.context,volleyError.getMessage(),Toast.LENGTH_LONG).show();
            }
        }) {
            /**
             * 封装发送Token
             * @return
             * @throws AuthFailureError
             */
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                final Map<String,String> header=new HashMap<>();
                if(Token!=null){
                    header.put("Authorization","Bearer "+Token);
                    header.put("Content-Type","application/json");
                }
                return header;
            }
        };

        //如果不是get请求，不缓存结果
        if(method!= Request.Method.GET){
            jr.setShouldCache(false);
        }

        //添加到队列中
        App.requestQueue.add(jr);

    }


    /**
     * 定义回调接口，用于访问成功
     */
    public interface BackJson<T>{
        void success(T t);
    }



}
